package picture;

import javax.sound.sampled.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;

/**
 * 使用Java Swing库，实现了一个简单的电子相册程序，展示了如何处理用户输入、播放音频、显示图片以及基本的错误处理。
 * 功能：
     * 用户登录：
           程序启动时显示一个登录窗口，要求用户输入用户名和密码。如果用户名是"箫小乐"且密码是"666"，则认为登录成功。
     * 音频播放：
          在用户成功登录后，程序会播放一个音频文件。如果播放过程中遇到异常（如文件未找到、格式不支持等），程序会显示一个错误对话框，并终止运行。
     * 图片展示：
           登录成功后，程序会打开一个新的窗口，显示一个电子相册。
           相册窗口分为两个部分：上面板用于展示图片，下面板包含两个按钮（“上一个”和“下一个”）用于在图片间切换。
     * 图片浏览：
           用户可以通过点击“上一个”和“下一个”按钮来浏览预设的五张图片。
           图片的路径被存储在一个字符串数组中，并通过ImageIcon对象加载显示。
     * 错误处理：
          如果登录失败，程序会在登录窗口显示错误信息，并清空用户名和密码输入框，让用户可以重新输入。
 */
public class MyPicture {
    /**
     * 记录当前展示的图片下标--全局变量（main外）
     */
    static int index = 0;


    public static void main(String[] args) {

        // 创建窗口，标题为“登录电子相册”
        JFrame window = new JFrame("登录电子相册");
        // 设置窗口大小和位置                  left, top, width, height
        window.setBounds(500, 200, 500, 300);
        // 确保关闭窗口时程序退出
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 创建一个自定义布局的面板，用于放置其他组件
        JPanel panel = new JPanel(null);     //null--去除有关面板的原有规则，按自定义运行
        // 将面板装入窗口
        window.add(panel);

        // 创建用户名标签并设置其位置和大小
        JLabel username = new JLabel("用户名:");
        username.setBounds(150, 50, 100, 30);
        // 将标签加入面板
        panel.add(username);

        // 创建密码标签并设置其位置和大小
        JLabel password = new JLabel("密码:");
        password.setBounds(150, 100, 100, 30);
        // 将密码标签添加到面板中
        panel.add(password);

        // 创建一个用于显示错误信息的标签，并设置其位置和大小
        JLabel error = new JLabel("");
        error.setBounds(180, 20, 300, 20);
        // 将错误信息标签添加到面板中，并设置文字颜色为红色
        panel.add(error);
        error.setForeground(Color.red);

        // 创建用户名输入框并设置其位置和大小
        JTextField inputName = new JTextField();
        inputName.setBounds(200, 50, 150, 30);
        // 将输入框加入面板
        panel.add(inputName);

        // 创建密码输入框并设置其位置和大小
        JPasswordField inputPassword = new JPasswordField();
        inputPassword.setBounds(200, 100, 150, 30);
        // 将密码输入框添加到面板中
        panel.add(inputPassword);

        // 创建登录按钮并设置其位置和大小
        JButton login = new JButton("登录");
        login.setBounds(200, 150, 100, 30);
        // 将登录按钮添加到面板中
        panel.add(login);

        /*
          为登录按钮添加事件监听器。
          在监听中，可以编写一个代码，代码会在按钮被点击的时候执行。
         */
        login.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //从输入框获取输入的用户名和密码
                String username = inputName.getText();
                String password = inputPassword.getText();
                //判断用户名，密码是否登录成功
                System.out.println(username);
                System.out.println(password);
                boolean result = username.equals("箫小乐") && password.equals("666");

                //若登录成功
                if (result) {
                    System.out.println("登录成功");
                    //关闭当前窗口，切换成新的相册窗口
                    window.dispose();    //关闭窗口
                    JFrame windows = new JFrame("我的相册");
                    windows.setBounds(400, 100, 800, 600);
                    //清空原有的摆放规则，自己设置摆放位置。
                    windows.setLayout(null);
                    windows.setVisible(true);
                    // 确保关闭窗口时程序退出
                    windows.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                    // 播放背景音乐
                    try {
                        // 获取音乐资源 ， 这里只能是wav文件
                        File file = new File("D:/javalianxi/project/digital-photo-album/1.wav");

                        // 使用AudioSystem加载音频流
                        AudioInputStream audioInputStream =
                                AudioSystem.getAudioInputStream(file);

                        //Clip 类是 Java 中用于处理音频剪辑（音频片段）的类。
                        Clip clip = AudioSystem.getClip();

                        // 打开音频设备
                        clip.open(audioInputStream);

                        // 播放音频
                        clip.start();
                    } catch (UnsupportedAudioFileException | IOException | LineUnavailableException ex) {
                        System.err.println("音频播放失败: " + ex.getMessage());
                        JOptionPane.showMessageDialog(null, "音频播放失败: " + ex.getMessage(),
                                "错误", JOptionPane.ERROR_MESSAGE);
                        // 停止程序运行
                        System.exit(1);
                    }

                    //新窗口（相册窗口）分为上面板--图片    下面版--按钮
                    JPanel top = new JPanel(null);
                    top.setBounds(0, 0, 800, 500);
                    windows.add(top);
                    JPanel bottom = new JPanel(null);
                    bottom.setBounds(0, 500, 800, 100);
                    windows.add(bottom);

                    //下面版显示上一个和下一个按钮
                    JButton prevButton = new JButton("上一个");
                    prevButton.setBounds(100, 20, 80, 30);
                    bottom.add(prevButton);
                    JButton nextButton = new JButton("下一个");
                    nextButton.setBounds(600, 20, 80, 30);
                    bottom.add(nextButton);

                    //上面板显示图片
                   /* 获得一个图标（图片）
                    ImageIcon icon = new ImageIcon("D:/javalianxi/project/digital-photo-album/img/Naruto.jpg");
                   */
                    //获得5张图片，用数组储存图片路径
                    String[] paths = new String[]{"D:/javalianxi/project/digital-photo-album/img/Naruto.jpg",
                            "D:/javalianxi/project/digital-photo-album/img/Sasuke.jpg",
                            "D:/javalianxi/project/digital-photo-album/img/Itachi.jpg",
                            "D:/javalianxi/project/digital-photo-album/img/Madara.jpg",
                            "D:/javalianxi/project/digital-photo-album/img/Obito.jpg"};
                    //使这5个图片获得对应图片，循坏实现
                    ImageIcon[] icons = new ImageIcon[5];
                    for (int i = 0; i < 5; i++) {
                        ImageIcon icon = new ImageIcon(paths[i]);
                        icons[i] = icon;
                    }

                    //使用Label显示图片，并添加到上面板中
                    JLabel img = new JLabel("");
                    img.setBounds(0, 0, 800, 500);
                    img.setIcon(icons[index]);  //默认显示第一张图片
                    top.add(img);

                    //为上一个按钮添加事件监听器--编写点击上一个按钮要执行的操作
                    prevButton.addActionListener(new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            //当前展示的是index位置的图片，上一个是index-1
                            if (index == 0) {
                                index = 4;
                            } else {
                                index--;
                            }
                            //代码至此，index存储的就是接下来要展示的图片下标
                            img.setIcon(icons[index]);
                        }
                    });

                    //为下一个按钮添加事件监听器--编写点击下一个按钮要执行的操作
                    nextButton.addActionListener(new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            //当前展示的是index位置的图片，下一个是index+1
                            if (index == 4) {
                                index = 0;
                            } else {
                                index++;
                            }
                            //代码至此，index存储的就是接下来要展示的图片下标
                            img.setIcon(icons[index]);
                        }
                    });

                } else {
                    //若登陆失败--显示一个错误提示的文字内容，并清空之前的输入框
                    //通过代码重新设置标签和输入框的内容
                    error.setText("用户名密码错误！请重新登录");
                    inputName.setText("");
                    inputPassword.setText("");
                }
            }
        });


        //窗口可见--展示窗口
        window.setVisible(true);
    }
}